package simpleParticleSystemPackage;

import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.vp.*;
import javax.swing.JFrame;
import java.util.*;

/**
* Klasse zur Erzeugung eines einfachen Partikelsystems
*
* @author Frank Klawonn
* Letzte Aenderung 1.8.2008
*
*/
public class SimpleParticleSystem
{

  //Die Transformationsgruppe im Szenengraphen, der das Partikelsystem zugeordnet werden soll.
  public TransformGroup tg;

  //Die Wartezeit in Millisekunden, bis das Partikelsystem beginnen soll.
  public long delay;

  //Die Zeit in Millisekunden, wie lange das Partikelsystem aktiv sein soll.
  public long duration;

  //Hiermit werden die einzelnen Partikel erzeugt.
  public ISimpleParticleCreator particleCreator;

  //Hiermit werden die Zeiten zwischen zwei aufeinander folgenden Partikeln bestimmt.
  public ILongCreator interarrivalTime;

  //Hiermit werden die Lebensdauern der einzelnen Partikel erzeugt
  public ILongCreator lifeSpan;

  //Hiermit werden die Geschwindigkeiten der einzelnen Partikel erzeugt.
  public IFloatCreator velocity;

  //Hiermit werden die Startpositionen der einzelnen Partikel erzeugt.
  public IVector3fCreator startPosition;

  //Hiermit werden die Bewegungsrichtungen der einzelnen Partikel erzeugt.
  public IDirectionCreator direction;

  /**
  * Ein einfacher Default-Konstruktor der alle Parameter mit bestimmten Defaults belegt.
  *
  * @param transGroup   Die Transformationsgruppe im Szenengraphen, der das Partikelsystem zugeordnet werden soll.
  */
  public SimpleParticleSystem(TransformGroup transGroup)
  {
    tg = transGroup;
    delay = 2000;
    duration = 10000;
    Appearance app = new Appearance();
    Color3f col = new Color3f(0.7f,0.7f,0.0f);
    setToMyDefaultAppearance(app,col);
    particleCreator = new ConstantSphereCreator(0.01f,app);
    interarrivalTime = new ConstantLongCreator(50);
    lifeSpan = new ConstantLongCreator(500);
    velocity = new ConstantFloatCreator(1);
    startPosition = new ConstantVector3fCreator(0,0,0);
    direction = new ConstantDirectionCreator(0,Math.PI/2);

  }

  /**
   * Konstruktor, dem alle notwendigen Parameter uebergeben werden.
   *
   * @param transGroup TransformGroup
   * @param delay long
   * @param duration long
   * @param particleCreator ISimpleParticleCreator
   * @param interarrivalTime ILongCreator
   * @param lifeSpan ILongCreator
   * @param velocity IFloatCreator
   * @param startPosition IVector3fCreator
   * @param direction IDirectionCreator
   */
  public SimpleParticleSystem(TransformGroup transGroup,
                              long delay,
                              long duration,
                              ISimpleParticleCreator particleCreator,
                              ILongCreator interarrivalTime,
                              ILongCreator lifeSpan,
                              IFloatCreator velocity,
                              IVector3fCreator startPosition,
                              IDirectionCreator direction)
  {
    tg = transGroup;
    this.delay = delay;
    this.duration = duration;
    this.particleCreator = particleCreator;
    this.interarrivalTime = interarrivalTime;
    this.lifeSpan = lifeSpan;
    this.velocity = velocity;
    this.startPosition = startPosition;
    this.direction = direction;

  }


  /**
  * Nachdem das Partikelsystem erzeugt wurde, muss es durch den Aufruf dieser Methode aktiviert werden. Bis
  * zum eigentlichen Start wartet das Partikelsystem dann noch die delay-Zeit ab.
  */
  public void activateParticleSystem()
  {
    SimpleParticleSystemRunner psr = new SimpleParticleSystemRunner(this);
    psr.start();
  }


  /**
  * Erzeugt eine Standardoberflaechenstruktur in einer gewuenschten Farbe
  *
  * @param app      Die Appearance, mit der die Oberflaeche belegt werden soll
  * @param col      Die gewuenschte Farbe
  */
  public static void setToMyDefaultAppearance(Appearance app, Color3f col)
  {
    app.setMaterial(new Material(col,col,col,col,150.0f));
  }



}
